parser: Add gtk_css_parser_has_token()
authorBenjamin Otte <otte@redhat.com>
Sat, 23 Mar 2019 17:21:59 +0000 (18:21 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 12 Apr 2019 17:34:28 +0000 (19:34 +0200)
This is ithe first step towards converting the parsing code to use
tokens. For now, the topken type is just a magic enum value that only
works as-needed.

gtk/gtkcssparser.c
gtk/gtkcssparserprivate.h
gtk/gtkcssprovider.c

index b64165efe4cbdf76fc41d1ed0541cfbba7086de4..5a786df8c3ebb5823745a6859316e99dc20dd983 100644 (file)
@@ -461,11 +461,78 @@ _gtk_css_parser_try_ident (GtkCssParser *parser,
 }
 
 gboolean
-_gtk_css_parser_is_string (GtkCssParser *parser)
+gtk_css_parser_has_token (GtkCssParser    *parser,
+                          GtkCssTokenType  type)
 {
   g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), FALSE);
 
-  return *parser->data == '"' || *parser->data == '\'';
+  switch (type)
+  {
+    case GTK_CSS_TOKEN_STRING:
+      return *parser->data == '"' || *parser->data == '\'';
+
+    case GTK_CSS_TOKEN_OPEN_CURLY:
+      return *parser->data == '{';
+
+    case GTK_CSS_TOKEN_CLOSE_CURLY:
+      return *parser->data == '}';
+
+    case GTK_CSS_TOKEN_OPEN_PARENS:
+      return *parser->data == '(';
+
+    case GTK_CSS_TOKEN_CLOSE_PARENS:
+      return *parser->data == ')';
+
+    case GTK_CSS_TOKEN_COMMA:
+      return *parser->data == ',';
+
+    case GTK_CSS_TOKEN_COLON:
+      return *parser->data == ':';
+
+    case GTK_CSS_TOKEN_SEMICOLON:
+      return *parser->data == ';';
+
+    case GTK_CSS_TOKEN_AT_KEYWORD:
+      return *parser->data == '@';
+
+    case GTK_CSS_TOKEN_EOF:
+      return *parser->data == 0;
+
+    case GTK_CSS_TOKEN_IDENT:
+      return *parser->data != 0 &&
+             strchr (NMSTART "-", *parser->data) != NULL;
+
+    default:
+    case GTK_CSS_TOKEN_FUNCTION:
+    case GTK_CSS_TOKEN_HASH_UNRESTRICTED:
+    case GTK_CSS_TOKEN_HASH_ID:
+    case GTK_CSS_TOKEN_URL:
+    case GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION:
+    case GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION:
+    case GTK_CSS_TOKEN_DIMENSION:
+    case GTK_CSS_TOKEN_WHITESPACE:
+    case GTK_CSS_TOKEN_OPEN_SQUARE:
+    case GTK_CSS_TOKEN_CLOSE_SQUARE:
+    case GTK_CSS_TOKEN_CDC:
+    case GTK_CSS_TOKEN_CDO:
+    case GTK_CSS_TOKEN_DELIM:
+    case GTK_CSS_TOKEN_SIGNED_INTEGER:
+    case GTK_CSS_TOKEN_SIGNLESS_INTEGER:
+    case GTK_CSS_TOKEN_SIGNED_NUMBER:
+    case GTK_CSS_TOKEN_SIGNLESS_NUMBER:
+    case GTK_CSS_TOKEN_PERCENTAGE:
+    case GTK_CSS_TOKEN_INCLUDE_MATCH:
+    case GTK_CSS_TOKEN_DASH_MATCH:
+    case GTK_CSS_TOKEN_PREFIX_MATCH:
+    case GTK_CSS_TOKEN_SUFFIX_MATCH:
+    case GTK_CSS_TOKEN_SUBSTRING_MATCH:
+    case GTK_CSS_TOKEN_COLUMN:
+    case GTK_CSS_TOKEN_BAD_STRING:
+    case GTK_CSS_TOKEN_BAD_URL:
+    case GTK_CSS_TOKEN_COMMENT:
+      g_assert_not_reached ();
+      return FALSE;
+    }
 }
 
 char *
@@ -838,7 +905,7 @@ gtk_css_parser_resync_internal (GtkCssParser *parser,
     if (gtk_css_parser_new_line (parser))
       continue;
 
-    if (_gtk_css_parser_is_string (parser))
+    if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_STRING))
       {
         /* Hrm, this emits errors, and i suspect it shouldn't... */
         char *free_me = _gtk_css_parser_read_string (parser);
index f5c4fdddc8d852a2b66870f8a929ed8b53a96d77..861d5db677fb3b56bb21b0a62259af36bec62cac 100644 (file)
@@ -21,6 +21,7 @@
 #include <gtk/gtkcssprovider.h>
 
 #include <gtk/css/gtkcss.h>
+#include "gtk/css/gtkcsstokenizerprivate.h"
 
 G_BEGIN_DECLS
 
@@ -53,7 +54,8 @@ gboolean        _gtk_css_parser_begins_with       (GtkCssParser          *parser
                                                    char                   c);
 gboolean        _gtk_css_parser_has_prefix        (GtkCssParser          *parser,
                                                    const char            *prefix);
-gboolean        _gtk_css_parser_is_string         (GtkCssParser          *parser);
+gboolean        gtk_css_parser_has_token          (GtkCssParser          *parser,
+                                                   GtkCssTokenType        token_type);
 
 /* IMPORTANT:
  * _try_foo() functions do not modify the data pointer if they fail, nor do they
index 383568dd98ee945b468243cbfb4e1df1cd57329a..f91ce9b0d19b0da7ff31316b8504aec22a8f795f 100644 (file)
@@ -782,7 +782,7 @@ parse_import (GtkCssScanner *scanner)
       return FALSE;
     }
 
-  if (_gtk_css_parser_is_string (scanner->parser))
+  if (gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_STRING))
     {
       char *uri;